// IMPORTATION DES BIBLIOTHEQUES
var prompt = require('sync-prompt').prompt; //pour les entrées utilisateurs
var fs = require("fs"); //pour la lecture ecriture dans les fichiers

//INITIALISATION DES VARIABLES
var dtstart = "";
var dtend = "";
var duration = "";
var organizer = "";
var mail = "";
var summary = "";
var event = new Array();
var input = [];
var symb = ["BEGIN:VCALENDAR","VERSION:2.0","BEGIN:VEVENT","DTSTART:","DTEND:","DURATION:","ORGANIZER:",":MAILTO:","SUMMARY:","END:VEVENT","END:VCALENDAR"];
var myArgs = process.argv.slice(1);
var AllEvent = new Array();

// Tableau qui contient les plannings en fonction des lieux
var tab_planning = new Array();

//On stock le fichier ics passé en paramètre dans la variable planning.
//On prend un fichier planning en argument et on le découpe.
//var planning=fs.readFileSync(myArgs[1], 'utf8');

//On cree le grand tableau des plannings une fois que l'utilisateur a spécifié le nom du dossier où se situe les fichiers ics
creerTableauDesPlannings();
menu();

function menu() {
  //MENU DE L'APPLICATION
  console.log('             []                                       []');
  console.log('           .:[]:_                                   ,:[]:.');
  console.log('         .: :[]: :-.                             ,-: :[]: :.');
  console.log("       .: : :[]: : :`._                       ,.': : :[]: : :.");
  console.log("     .: : : :[]: : : : :-._               _,-: : : : :[]: : : :.");
  console.log(" _..: : : : :[]: : : : : : :-._________.-: : : : : : :[]: : : : :-._");
  console.log(' _:_:_:_:_:_:[]:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:_:[]:_:_:_:_:_:_');
  console.log(' !!!!!!!!!!!![]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![]!!!!!!!!!!!!!');
  console.log(' ^^^^^^^^^^^^[]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[]^^^^^^^^^^^^^');
  console.log('             []                BIENVENUE              []');
  console.log('             []                                       []');
  console.log('             []                                       []\n\n');

  console.log("1)Créer un rendez-vous");
  console.log("2)Voir le planning");
  console.log("3)Consulter le volume horaire");
  console.log("4)Importer au format CSV");
  console.log("5)Exporter au format CSV");
  console.log("6)Importer au format iCal");
  console.log("7)Exporter au format iCal\n");
  console.log("8)Quitter\n");

  //On enregistre ce que veut faire l'utilisateur
  lireClavier();
  menu();
}

//FONCTIONS DE BASE
function lireClavier() {
  var lecture = prompt("Choisissez une action:");
  switch(lecture) {
    case "1":
      creerRDV();
      break;
    case "2":
      afficherRendezVous();
      break;
    case "3":
      volumeHoraire();
      break;
    case "4":
      importCSV();
      break;
    case "5":
      exportCSV();
      break;
    case "6":
      importICal();
      break;
    case "7":
      exportICal();
      break;
    case "8":
sauvegardeBDD();
      process.exit(1);
      break;
    default:
      console.log("Cette fonction n'existe pas!");
      break;
  }
}

function writeTextFile(afilename, output) {
  var writeStream = fs.createWriteStream(afilename);
  writeStream.write(output);
  writeStream.end();
}


//FONCTIONS DE L'APPLICATION
function creerTableauDesPlannings() {
  var listeFichier = fs.readdirSync(myArgs[1] + "/");
  console.log(listeFichier);

  for (var i = 0 ; i < listeFichier.length ; i++){
    
    //On recup!re  le fichier à chaque "espace" et on stock les elements découpés dans un tableau
    fichier = listeFichier[i]; 

    console.log("FILE: "+fichier);

    if(verifierFichierICal(fichier)){
      input = fs.readFileSync(myArgs[1] + "/" + fichier, "utf8").split(/\s/);
      console.log()
      ajoutRdvIcalAuTableau(input);

    }
  }
}

function ajoutRdvIcalAuTableau(input) {
  var rdv = listeRendezVous(input);
  //console.log(rdv);

  //Avant d'ajouter les evenements au tableau, on les ajoutes dans un tableau AllEvent;
  AllEvent = rdv.slice(0);

  for (var i = 0; i < rdv.length; i++) {
    // On verifie dans le tableau des plannings  à l'indice du lieu, si un planning existe déjà
    if(tab_planning[rdv[i].summary] != undefined) {
      ajouterRDVinit(tab_planning[rdv[i].summary],rdv[i]);
    } else{
      var planning = creerPlanning();
      tab_planning[rdv[i].summary] = planning;
      ajouterRDVinit(tab_planning[rdv[i].summary],rdv[i]);
    }
  }
}

function afficherRendezVous() {
  var listRDV = "";
  for ( var r=0; r < AllEvent.length; r++ ){
    var info = "Date début : ";
	info += AllEvent[r].dtstart.substring(0,4) + "-" + AllEvent[r].dtstart.substring(4,6) + "-" +AllEvent[r].dtstart.substring(6,8) + ";\n";
	info += "Date fin : ";
	info += AllEvent[r].dtend.substring(0,4) + "-" + AllEvent[r].dtend.substring(4,6) + "-" +AllEvent[r].dtend.substring(6,8) + ";\n";
	info += "Durée : ";
	info += AllEvent[r].duration.substring(2,7)+";\n";
	info += "Organiseur : ";
	info += AllEvent[r].organizer+";\n";
	info += "Mail : ";
	info += AllEvent[r].mail+";\n";
	info += "Résumé : ";
	info += AllEvent[r].summary+";\n";
	
	listRDV += info + "\n";
  }
  
  console.log(listRDV);
}


function volumeHoraire() {
  //On récupère tous les rendez-vous dans un tableau (tableau d'objets rendez-vous)
  var tabRDV=AllEvent;
  var sumHeure=0;
  var sumMinute=0;
  
  //On calcule toutes les heures et les minutes
  for(var i = 0; i < tabRDV.length; i++) {
    sumHeure = sumHeure + parseInt(tabRDV[i].duration.substring(2,3));
    sumMinute = sumMinute + parseInt(tabRDV[i].duration.substring(4,5));
  }
  //Si le nombre de minutes dépasse 60 on pense à reporter sur les heures
  if(sumMinute > 60){
  sumHeure = sumHeure + parseInt(sumHeure / 60);
  sumMinute = sumHeure % 60;
  }

  //On affiche
  console.log("Attention: les évenements étant stockés par tranche de 3 min, la somme des heures de chaque "
  + "événement peut différer du volume horaire total (de quelques dizaines de minutes).\n"
  + "Pour un calcul précis, préférez le volume horaire total.\n");

  console.log("Le volume horaire total est de " + sumHeure + " H " + sumMinute + " minutes.\n");
  
  //Calcul des horaies pour chaque Lieu
  for (var key in data = tab_planning) {
  //On réinitialise le temps à chaque Lieu
  sumHeure = 0;
  sumMinute = 0;
  
   for(var i = 0; i < data[key].length; i++) {
   
    for (var j = 0; j < data[key][i].length; j++) {
      
    if(data[key][i][j] != undefined) sumMinute += 30;
    }
   }
   sumHeure = parseInt(sumMinute / 60);
   sumMinute = sumMinute % 60;
   //On affiche
   console.log("Volume horaire pour " + key + " : " + sumHeure + "h" + sumMinute);
}
}

function exportCSV () {
 
    var nomFichier = "csv/planning.csv";
    var contenu = "";
	var createur;
    //Ouverture du flux d'écriture
    
    contenu += "lundi;mardi;mercredi;jeudi;vendredi;samedi;dimanche;\n";
    // On boucle sur toutes les demi-heures de la journée 

    for (var i = 0 ; i < 48; i++) {
      for (var j = 0; j < 7; j++) {    
	  var isVide = true;
	    for (var k in tab_planning) {
        if (tab_planning[k][j][i] != undefined) {
          isVide = false;
          createur= tab_planning[k][j][i].organizer + "("+ tab_planning[k][j][i].summary + ");";
        }
		
        // A partir de 6 (Dimanche), on fait un retour à la ligne
        
      }
	  if (isVide==true){
		  contenu += "vide;";
		}else{
		  contenu += createur;
		}
	  if (j == 6) {
          
          contenu += "\n";
        }
    }
    //Fermeture du flux d'écriture
   
    
  }
  fs.writeFileSync(nomFichier,contenu);
  console.log("Export effectué!");
}


// Pour ajouter une propriété Ical à la fonction Date
Date.prototype.Ical = function() {
return this.toISOString().replace(/-|:|\..*/g, "");
};

function importCSV(){
	var fichier = prompt("Indiquez le planning sous format CSV à importer (.csv): ");
	
    while(!fs.existsSync(fichier)) fichier = prompt("Veuillez indiquer un fichier existant : ");
    fichier = verifierFichierCSV(fichier);

	var dateDebut = prompt('Donnez sa date de début (ex 2014-11-25): ');
	verfierDate(dateDebut);

	tab_csv = fs.readFileSync(fichier, "utf8").split(/\n/);
	
	var planning = creerPlanning();
	
	var nomLieu = "";
	var nomOrganizer = "";
	var nomMail = "";
	var dtStartJS = ""; 
	var dtEndJS = "";
	
	for (var i = 1 ; i <= 48 ; i++) {
		 for (var j = 0; j < 7; j++) {
			
			ligne_csv = tab_csv[i].split(/;/);
			planning[j][i] = ligne_csv[j];

			var regex = /^.+\((.*)\).*$/;

			// On recupere le nom du lieu avec les parentheses dans les données du CSV 
			nomLieu = ligne_csv[j].match(regex);
			// On recupere le lieu entre les parentheses
			nomOrganizer = ligne_csv[j].split("(");

			if (nomLieu != null) {
				nomLieu = nomLieu[1];
				nomOrganizer = nomOrganizer[0];
			}
		}
	}

	//Si le planning n'existe pas encore, Ok on insere normalement dans notre tableau des plannings
	if(tab_planning[nomLieu] == undefined){
		tab_planning[nomLieu] = planning ;
	}

	// Sinon on fusionne les 2 plannings
	else{

		var anneeD=dateDebut.substring(0,4);
        var moisD=dateDebut.substring(5,7);
        var jourD=dateDebut.substring(8,10);

        var anneeF=anneeD;
        var moisF=moisD;
        var jourF=jourD;

        var heureDebut = "";
        var minuteDebut = "";
        var heureFin = "";
        var minuteFin = "";
		
		for (var j = 0 ; j < 7 ; j++) {
			 for (var i = 1; i <= 48; i++) {
			 	
			 	// Quand on trouve un rendez-vous dans le planning 
			 	if(planning[j][i] != 'vide'){
			 	
			 		// On crée un objet Rdv 
			 		var rdv = new Array();

			 		heureDebut = (parseInt(i/2) < 10) ? "0" + parseInt(i/2) : parseInt(i/2);
			 		minuteDebut = (i%2 != 0) ? 30 : 0 ;

			 		k = i+1;

			 		// On cherche jusqu'à ce que l'évévenement soit fini
			 		while(planning[j][k] != 'vide'){
						// On stock l'indice de l'heure du début et on se déplace verticalement dans la planning
						k++;
						jourF = (k == 48) ? jourD + 1 && i = 1 : jourD ;
					}

					heureFin = (parseInt((i-1)/2) < 10) ? "0" + parseInt((i-1)/2) : parseInt(k/2);
					minuteFin = (k%2 != 0) ?  30 : 0;

		 			dtStartJS = new Date(new Date(anneeD,(moisD-1),jourD,heureDebut,minuteDebut).getTime()+(3600*1000));
	 				dtEndJS = new Date(anneeF,(moisF-1),jourF,heureFin,minuteFin,3600);
	 			
	 				dtStartJS = dtStartJS.Ical()+ "Z";
	 				dtEndJS = dtEndJS.Ical()+ "Z";

					var durationHeure = parseInt(heureFin)- parseInt(heureDebut);
    				var durationMinute = (minuteDebut > minuteFin) ? parseInt(minuteDebut)-parseInt(minuteFin):parseInt(minuteFin)-parseInt(minuteDebut);
    				durationMinute= (durationMinute<10) ? "0" + durationMinute : durationMinute;

					durationJS = "PT"+durationHeure+"H"+durationMinute+"M0S";

					rdv.push({dtstart:dtStartJS,dtend:dtEndJS,duration:durationJS,organizer:nomOrganizer,mail:nomMail,summary:nomLieu});

					ajouterRDV(tab_planning[nomLieu][j][i],rdv[rdv.length-1]);

					// Pour poursuivre la lecture à la fin du rendez-vous
					i = k;
				}				
			}
		}  
	}
	
	console.log("Import effectué!");
}


function creerRDV(){

    //On demande des renseignements à l'utilisateur
    var nom = prompt('Donnez un nom à votre événement:');
    var dateDebut = prompt('Donnez sa date de début (ex 2014-11-25): ');
    //vérification de l'entrée utilisateur
    verfierDate(dateDebut);
    var dateFin = prompt('Donnez sa date de fin: ');
    //vérification de l'entrée utilisateur
    verfierDate(dateFin);
    var heureDebut = prompt('Donnez son heure de début (ex 11:00:00):');
    //vérification de l'entrée utilisateur
    verifierHeure(heureDebut);
    var heureFin = prompt('Donnez son heure de fin: ');
    //vérification de l'entrée utilisateur
    verifierHeure(heureFin);
    var mail = prompt('Donnez un mail:');
    verifierMail(mail);
    var personne = prompt('Donnez un nom au createur de l\'évenement:');
    verifierPersonne(personne);

    //INSERTION DANS LE PLANNING


    //FORMATION d'un event iCal
    if(nom == '' || dateDebut == '' || dateFin == '' || heureDebut == '' || heureFin == ''){
    console.log("Un ou des champs sont vide(s)!");
    }
    else {
      //On découpe les elements de façon à respecter la norme iCal 
      /**
      * VOCABULAIRE:
      * anneeD: année de debut de l'evenement
      * anneeF: année de fin de l'évenement 
      * moisD: mois de debut de l'évenement
      * moisF: mois de fin de l'évenement
      * jourD: jour de debut de l'évenement
      * jourF: jour de fin de l'événement
      * hdh: heure de debut attribut heure
      * hdm: heure de debut attribut minute
      * hfh: heure de fin attribut heure
      * hfm: heure de fin attribut minute
      */
        var anneeD = dateDebut.substring(0,4);
        var moisD = dateDebut.substring(5,7);
        var jourD = dateDebut.substring(8,10);
        var anneeF = dateFin.substring(0,4);
        var moisF = dateFin.substring(5,7);
        var jourF = dateFin.substring(8,10);

        var hdh = heureDebut.substring(0,2);
        var hdm = heureDebut.substring(3,5);
        var hfh = heureFin.substring(0,2);
        var hfm = heureFin.substring(3,5);
        
        //On calcul la durée de l'événement
        var durationHeure = parseInt(hfh)-parseInt(hdh);
        var durationMinute = hdm > hfm?parseInt(hdm) - parseInt(hfm):parseInt(hfm) - parseInt(hdm);
        durationMinute = durationMinute < 10 ? "0" + durationMinute:durationMinute;

        /**Plutot que de supprimer la dernière ligne du fichier et d'écrire le nouvel événement
        *on va réécrire tout le fichier avec le nouvel événement dedans
        //var ancienPlanning=planning.substring(0,planning.length-15);
        var insertion="BEGIN:VEVENT\n"
                       +"DTSTART:"+anneeD+moisD+jourD+"T"+hdh+hdm+"00Z\n"
                       +"DTEND:"+anneeF+moisF+jourF+"T"+hfh+hfm+"00Z\n"
                       +"DURATION:PT"+durationHeure+"H"+durationMinute+"M0S\n"
                       +"ORGANIZER;CN="+personne+":MAILTO:jsmith@host1.com\n"
                       +"SUMMARY:"+nom+"\n"
                       +"END:VEVENT\n"
                       +"END:VCALENDAR"*/         
        //writeTextFile(myArgs[1], ancienPlanning+" \n"+insertion);

        var insertion = {dtstart:anneeD+moisD+jourD+"T"+hdh+hdm+"00Z",dtend:anneeF+moisF+jourF+"T"+hfh+hfm+"00Z",duration:"PT"+durationHeure+"H"+durationMinute+"M0S",organizer:personne,mail:mail,summary:nom};
                
        ajouterRDV(nom,insertion);
        AllEvent.push(insertion);
    }

}

//Vérifier que l'utilisateur entre un fichier .ics
function verifierFichierICal(fichier){
  var myRegex = new RegExp("\.ics$","i");
  if(myRegex.test(fichier) == true) return true;
  else false;
}
//Vérifier que l'utilisateur entre un fichier .ics
function verifierFichierCSV(fichier){
  var myRegex = new RegExp("\.csv$","i");
  while(myRegex.test(fichier) == false) var fichier = prompt('Attention votre fichier doit être un CSV: ');
  return fichier;
}
//Vérifier que l'utilisateur entre une date
function verfierDate(date){
  var myRegex = /^[0-9]{4}\-[0-9]{2}\-[0-9]{1,2}$/;
    while(myRegex.test(date) == false) var date = prompt('Attention à la forme (ex 2014-11-25): ');
}
//Vérifier que l'utilisateur entre une heure
function verifierHeure(heure){
  var myRegex = /^[0-9]{2}\:[0-9]{2}\:[0-9]{2}$/;
    while(myRegex.test(heure) == false) var heure = prompt('Attention à la forme (ex 11:00:00): ');
}
//Vérifier que l'utilisateur entre un nom et un prenom
function verifierPersonne(personne){
  var myRegex = /^[A-Za-z0-9]*\ [A-Za-z0-9]*$/;
    while(myRegex.test(personne) == false) var personne = prompt('Attention à la forme (ex nomPersonne prenomPersonne): ');
}
//Vérifier que l'utilisateur entre un mail
function verifierMail(mail){
  var myRegex = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|fr|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)\b/;
    while(myRegex.test(mail) == false) var mail = prompt('Attention à la forme (ex test@test.fr: ');
}


//PARSER DEBUT
//Erreur appelé en cas de non conformité de la syntaxe du fichier iCS
function err(input) {
  console.log("Oups, une erreur de syntaxe dans votre fichier iCal \n--> ERROR sur " + input[0]);
  process.exit(0);
}

//Passe à l'élément suivant du tableau
function next(input) {
  var curS = input.shift();
  //console.log(curS);
  return curS
}
//Etudie l'élément courant sans passer à l'élément suivante
function hasNext(input) {
  var curS = input[0];
  tmp = curS.split(/:/); 
  return tmp;
}
//Etudie l'élément courant sans passer à l'élément suivante (Variante)
function hasNextBIS(input) {
  var curS = input[0];
  tmp = curS.split(/;/); 
  //console.log(curS);
  return tmp;
}

function accept(input){
  if(symb.indexOf(input[0]) >= 0) {
    return true;  
  }
  return false;
}
//Vérifie que l'élement correspond à la bonne syntaxe
function expect(input, s) {
  if(s == next(input)) {
    //console.log("Reckognized! "+s)
    return true;
  } else {
    err(input);
  }
  return false;
}

//COMMENCEMENT DE L'ANALYSE DU FICHIER 
// Règles
function listeRendezVous(input){
  expect(input, "BEGIN:VCALENDAR");
  expect(input, "");
  expect(input, "VERSION:2.0")
  expect(input, "");
  
  while(rendezVous(input)){

  }
  expect(input, "END:VCALENDAR");

  return event;
  //return dtstart+":"+dtend+":"+duration+":"+organizer+":"+mail+":"+summary;

}

function rendezVous(input){
 if(accept(input)){
    expect(input, "BEGIN:VEVENT");
    expect(input, "");
    body(input);
    expect(input, "");
    expect(input, "END:VEVENT");
    expect(input, "");
    if(hasNext(input)[0]=="BEGIN") return true;
    else return false;
  } else {
    err(input);
    return false;
  }
}

function body(input){
  DTSTART(input);
  expect(input, "");
  DTEND(input);
  expect(input, "");
  DURATION(input);
  expect(input, "");
  ORGANIZER(input);
  expect(input, "");
  SUMMARY(input);
}

function DTSTART(input){
  var curS = hasNext(input);
  if(curS[1].match(/[0-9]{8}T[0-9]{6}Z/)) {
    expect(input, curS[0] + ":" + curS[1]);
    dtstart = curS[1];
    return true;
  } else {
    err(input);
  }
}

function DTEND(input){
  var curS = hasNext(input);
  if(curS[1].match(/[0-9]{8}T[0-9]{6}Z/)) {
    expect(input, curS[0] + ":" + curS[1]);
    dtend = curS[1];
    return true;
  } else {
    err(input);
  }
}

function DURATION(input){
  var curS = hasNext(input);
  if(curS[1].match(/PT[0-9]{1}H[0-9]{2}M[0-9]{1}S/)) {
    expect(input, curS[0] + ":" + curS[1]);
    duration = curS[1];
    return true;
  } else {
    err(input);
  }
}

function ORGANIZER(input){
  var curS1 = hasNextBIS(input);
  if(curS1[1].match(/.*/)) {
    expect(input, curS1[0] + ";" + curS1[1]);
    //organizer=curS1[1];
  } else {
    err(input);
  }

  var curS2 = hasNext(input);
  if(curS2[1].match(/.*/)) {
    expect(input, curS2[0] + ":" + curS2[1] + ":" + curS2[2]);
    organizer = curS1[1].substring(3, curS1[1].length) + " " + curS2[0];
    mail = curS2[2];
    return true;
  } else {
    err(input);
  }

}

function SUMMARY(input){
  while(input[0] !== ""){  
    if(input[0] !== " "){
      var curS = curS + " " + next(input);
      if(curS.match(/[A-Za-z0-9]*/)){
        summary = curS.substring(18, curS.length);
        //return true;
      } else {
        err(input);
      }
    }//end if
  }//enf for

  event.push({dtstart:dtstart,dtend:dtend,duration:duration,organizer:organizer,mail:mail,summary:summary});
/**Variante renvoi d'un tableau 2D au lieu d'un tableau d'objet
*event.push([dtstart,dtend,duration,organizer,mail,summary]);*/
}
//FIN DU PARSER


//CODE DE THOMAS A COMMENTER
function creerPlanning(){
   var planning=new Array(7);
 for (var i=0; i<7;i++){
    planning[i]=new Array(48);
  }

  return planning;
}

function VerifierDisponibilite(planning,rdv) //retourne le rendez-vous déja posé
{

  var TabRdv=ConvIcalTableau(rdv);


    //rdv sur plusieurs jours
  while(TabRdv.caseJourStart!=TabRdv.caseJourEnd){
        for(var i=TabRdv.caseStartCreneau; i<48;i++){
           if(planning[TabRdv.caseJourStart][i]!=undefined){
             if(JSON.stringify(planning[TabRdv.caseJourStart][i])==JSON.stringify(rdv)){
              console.log("rendez vous déja ajouté")
            }
            else{
              console.log("Creneau non disponible");
              deplacerRDV(planning,planning[TabRdv.caseJourStart][i],rdv);

            }
            return planning[TabRdv.caseJourStart][i];
           }
        }
        TabRdv.caseJourStart+=1;
        TabRdv.caseStartCreneau=0;
  }
  //rdv sur un jour ou suite du rdv du jour précédent
  while(TabRdv.caseStartCreneau<=TabRdv.caseEndCreneau){
        if(planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau]!=undefined){
          if(JSON.stringify(planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau])==JSON.stringify(rdv)){
              console.log("rendez vous déja ajouté")
            }
            else{
              console.log("Creneau non disponible");
              deplacerRDV(planning,planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau],rdv);
            }
          return planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau];
        }
        TabRdv.caseStartCreneau+=1;
  }
  console.log("Creneau disponible");
  return true;
}

function VerifierDisponibiliteInit(planning,rdv) //retourne le rendez-vous déja posé
{

  var TabRdv=ConvIcalTableau(rdv);


    //rdv sur plusieurs jours
  while(TabRdv.caseJourStart!=TabRdv.caseJourEnd){
        for(var i=TabRdv.caseStartCreneau; i<48;i++){
           if(planning[TabRdv.caseJourStart][i]!=undefined){
             if(JSON.stringify(planning[TabRdv.caseJourStart][i])==JSON.stringify(rdv)){
              //console.log("rendez vous déja ajouté")
            }
            else{
              //console.log("Creneau non disponible");
              deplacerRDV(planning,planning[TabRdv.caseJourStart][i],rdv);

            }
            return planning[TabRdv.caseJourStart][i];
           }
        }
        TabRdv.caseJourStart+=1;
        TabRdv.caseStartCreneau=0;
  }
  //rdv sur un jour ou suite du rdv du jour précédent
  while(TabRdv.caseStartCreneau<=TabRdv.caseEndCreneau){
        if(planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau]!=undefined){
          if(JSON.stringify(planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau])==JSON.stringify(rdv)){
              //console.log("rendez vous déja ajouté")
            }
            else{
              //console.log("Creneau non disponible");
              deplacerRDV(planning,planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau],rdv);
            }
          return planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau];
        }
        TabRdv.caseStartCreneau+=1;
  }
  //console.log("Creneau disponible");
  return true;
}


function ajouterRDV(planning,rdv){

  if(VerifierDisponibilite(planning,rdv) == true){
    var TabRdv=ConvIcalTableau(rdv);
    
    while(TabRdv.caseJourStart!=TabRdv.caseJourEnd){
          for(var i=TabRdv.caseStartCreneau; i<48;i++){
             planning[TabRdv.caseJourStart][i]=rdv;
          }
          TabRdv.caseJourStart+=1;
          TabRdv.caseStartCreneau=0;
        }

    while(TabRdv.caseStartCreneau<=TabRdv.caseEndCreneau){
          planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau]=rdv;
          TabRdv.caseStartCreneau+=1;
    }
  }


}

function ajouterRDVinit(planning,rdv){

  if(VerifierDisponibiliteInit(planning,rdv) == true){
    var TabRdv=ConvIcalTableau(rdv);
    
    while(TabRdv.caseJourStart!=TabRdv.caseJourEnd){
          for(var i=TabRdv.caseStartCreneau; i<48;i++){
             planning[TabRdv.caseJourStart][i]=rdv;
          }
          TabRdv.caseJourStart+=1;
          TabRdv.caseStartCreneau=0;
        }

    while(TabRdv.caseStartCreneau<=TabRdv.caseEndCreneau){
          planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau]=rdv;
          TabRdv.caseStartCreneau+=1;
    }
  }


}


function deplacerRDV(planning,ancienRdv,nouveauRdv){
  var lecture=prompt("souhaitez-vous ecraser le rendez-vous existant o/n ?")
  if(lecture=="o"){
    supprimerRDV(planning,ancienRdv);
    ajouterRDV(planning,nouveauRdv);
  }
  else{
    lecture=prompt("Souhaitez-vous modifier l'horaire du rendez-vous o/n ? ")
      if(lecture=="o"){
        var lecture="";
        while(lecture.match(/[0-9]{8}T[0-9]{6}Z/) == null){
        lecture=prompt("Saississez le début du nouveau creneau au format YYYYMMDDTHHMMSSZ: ");
        }
        nouveauRdv.dtstart=lecture;
        lecture="";
        while(lecture.match(/[0-9]{8}T[0-9]{6}Z/) == null){
          lecture=prompt("Saississez la fin du nouveau creneau au format YYYYMMDDTHHMMSSZ: ");
        }
        nouveauRdv.dtend=lecture;
        ajouterRDV(planning,nouveauRdv);
      }
  }
}

function supprimerRDV(planning, rdv){
   var TabRdv=ConvIcalTableau(rdv);
   while(TabRdv.caseJourStart!=TabRdv.caseJourEnd){
        for(var i=TabRdv.caseStartCreneau; i<48;i++){
           if(JSON.stringify(planning[TabRdv.caseJourStart][i])==JSON.stringify(rdv)){
            delete planning[TabRdv.caseJourStart][i];
           }
        }
        TabRdv.caseJourStart+=1;
        TabRdv.caseStartCreneau=0;
  }
  //rdv sur un jour ou suite du rdv du jour précédent
  while(TabRdv.caseStartCreneau<=TabRdv.caseEndCreneau){
        if(JSON.stringify(planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau])==JSON.stringify(rdv)){
          delete planning[TabRdv.caseJourStart][TabRdv.caseStartCreneau];
        }
        TabRdv.caseStartCreneau+=1;
  }
  console.log("Suppression");
}


//Fontion de conversion des dates Ical vers Tableau JS
function ConvIcalTableau(rdv){
  //console.log("ConvIcalTableau " + rdv.dtstart);

  //Séparation des valeurs Ical
  var dtStart = {
    annee: rdv.dtstart.substr(0,4),
    mois: rdv.dtstart.substr(4,2),
    jour: rdv.dtstart.substr(6,2),
    heure: rdv.dtstart.substr(9,2),
    minute: rdv.dtstart.substr(11,2)
  }
  var dtEnd = {
    annee: rdv.dtend.substr(0,4),
    mois: rdv.dtend.substr(4,2),
    jour: rdv.dtend.substr(6,2),
    heure: rdv.dtend.substr(9,2),
    minute: rdv.dtend.substr(11,2)
  }

  //Création de dates javascript correspondantes
  var dtStartJS = new Date(dtStart.annee, (dtStart.mois-1), dtStart.jour, dtStart.heure, dtStart.minute);
  var demiHoraireStart = 0;
  
  if(dtStartJS.getMinutes() >= 30){
    demiHoraire = 1;
  }
  var dtEndJS = new Date(dtEnd.annee, (dtEnd.mois-1), dtEnd.jour, dtEnd.heure, dtEnd.minute);
  var demiHoraireEnd = 0;
  
  if(dtEndJS.getMinutes() >= 30){
    demiHoraireEnd = 1;
  }
  var caseStartCreneau = dtStartJS.getHours() * 2 + demiHoraireStart;
  var caseEndCreneau = dtEndJS.getHours() * 2 - 1 + demiHoraireEnd;
  var caseJourStart = dtStartJS.getDay();
  var caseJourEnd = dtEndJS.getDay();

return {caseJourStart:caseJourStart,caseStartCreneau:caseStartCreneau, caseJourEnd:caseJourEnd, caseEndCreneau:caseEndCreneau}
}

function exportICal() {
  var nomFichier = prompt("Indiquez le nom désiré du fichier: ");
  var content = symb[0] + "\r\n" + symb[1] + "\r\n";
  var temp;

  for (var i in AllEvent) {
    if (AllEvent[i] != undefined && temp != AllEvent[i]) {
          content += symb[2] + "\r\n";
          content += symb[3] + AllEvent[i].dtstart + "\r\n";
          content += symb[4] + AllEvent[i].dtend + "\r\n";
          content += symb[5] + AllEvent[i].duration + "\r\n";
          content += "ORGANIZER;CN=" + AllEvent[i].organizer;
          content += symb[7] + AllEvent[i].mail + "\r\n";
          content += symb[8] + AllEvent[i].summary + "\r\n";
          content += symb[9] + "\r\n";
          temp = AllEvent[i];
    }
  }
  content += symb[10] + "\r\n";
  fs.writeFileSync(nomFichier + ".ics", content);
  console.log("Export au format iCal effectué!");
}



function importICal() {
  var fichier = prompt("Indiquez le fichier sous format ICal à importer (.ics): ");
  
  while (!fs.existsSync(fichier) && !verifierFichierICal(fichier)) {
    fichier = prompt("Veuillez indiquer un fichier valide: ");
  }

  var tabICal = fs.readFileSync(fichier, "utf8").split(/\s/);

  // console.log(tabICal);
  var RDVs = listeRendezVous(tabICal);
  
  AllEvent = RDVs.slice(0);
  for (var i = 0; i < RDVs.length; i++) {
    if(tab_planning[RDVs[i].summary] != undefined) {
      ajouterRDV(tab_planning[RDVs[i].summary], RDVs[i]);
    }
    else {
      var planning = creerPlanning();
      tab_planning[RDVs[i].summary] = planning;
      ajouterRDV(tab_planning[RDVs[i].summary], RDVs[i]);
    }
  }

  console.log("Import au format iCal effectué!");
}

function sauvegardeBDD() {
  var content = symb[0] + "\r\n" + symb[1] + "\r\n";
  var temp;

  for (var i in AllEvent) {
    if (AllEvent[i] != undefined && temp != AllEvent[i]) {
          content += symb[2] + "\r\n";
          content += symb[3] + AllEvent[i].dtstart + "\r\n";
          content += symb[4] + AllEvent[i].dtend + "\r\n";
          content += symb[5] + AllEvent[i].duration + "\r\n";
          content += "ORGANIZER;CN=" + AllEvent[i].organizer;
          content += symb[7] + AllEvent[i].mail + "\r\n";
          content += symb[8] + AllEvent[i].summary + "\r\n";
          content += symb[9] + "\r\n";
          temp = AllEvent[i];
    }
  }
  content += symb[10] + "\r\n";
  fs.writeFileSync("ics/BDD.ics", content);
}


